package com.rainman.simpleredis.core.scheduled;

import lombok.Data;

/**
 *
 * redis数据库值为：
 *  固定执行：
 *      {"rate":1000}
 *      该值意思为每秒执行一次
 *  执行后执行：
 *      {"delay":2000}
 *      该值意思为执行完成后2秒再触发执行
 *  cron表达式执行：
 *      {"cron":"0 0 12 * * ?"}
 *      该值意思为每天中午 12 点执行
 *      {"cron":"0 0 12 * * ?",zone:"GMT+8"}
 *      该值意思为每天中午 12 点执行,且指定时区
 *
 * 若同时设置，优先级最高为rate->delay->corn
 *
 */
@Data
public class ScheduledInfo {

    private Long rate;
    private Long delay;
    private String corn;
    private String zone;

    private ScheduledInfo(){

    }

    /**
     *  固定执行
     *  例如{"rate":1000}该值意思为每秒执行一次
     * @param rate 固定间隔时间
     *
     * @return
     */
    public static ScheduledInfo buildRate(Long rate){
        ScheduledInfo scheduledInfo=new ScheduledInfo();
        scheduledInfo.setRate(rate);
        return scheduledInfo;
    }

    /**
     * 执行后执行
     *  例如{"delay":2000}该值意思为执行完成后2秒再触发执行
     *
     * @param delay 执行后间隔时间
     * @return
     */
    public static ScheduledInfo buildDelay(Long delay){
        ScheduledInfo scheduledInfo=new ScheduledInfo();
        scheduledInfo.setDelay(delay);
        return scheduledInfo;
    }


    /**
     *  cron表达式执行
     *  示例{"cron":"0 0 12 * * ?"} 该值意思为每天中午 12 点执行 默认时区
     *
     * @param corn 表达式
     * @return
     */
    public static ScheduledInfo buildCorn(String corn){
        return buildCorn(corn,null);
    }

    /**
     *  cron表达式执行
     *  示例{"cron":"0 0 12 * * ?",zone:"GMT+8"} 该值意思为每天中午 12 点执行,且指定时区
     *
     * @param corn 表达式
     * @param zone 时区
     * @return
     */
    public static ScheduledInfo buildCorn(String corn,
            String zone){
        ScheduledInfo scheduledInfo=new ScheduledInfo();
        scheduledInfo.setCorn(corn);
        scheduledInfo.setZone(zone);
        return scheduledInfo;
    }

}
